/**
 * 项目名：	Rumba Plan
 * 
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2006，所有权利保留。
 * 
 * 文件名：	BaseHButton.java
 * 模块说明：	
 * 修改历史：
 * 2006-6-21 - lxm - 创建。
 */
package com.hd123.rumba.jsp;

import java.util.Enumeration;
import java.util.Hashtable;

import org.apache.ecs.ConcreteElement;

import com.hd123.rumba.request.Dictionary;

/**
 * 字段按钮控件基类 | 服务端界面控件
 * 
 * @author lxm
 * 
 */
public abstract class BaseHButton implements IHFieldButton {

  /**
   * 构造函数。
   * 
   * @param params
   *          其它参数数组。其允许的参数包括两种：<br> - 一般参数。可用的参数说明参见相应的属性说明。 <br>-
   *          界面元素参数。以元素的标识名（例如"tdLabel"）开头，后一个为元素属性名，再后面一个为元素属性取值。
   */
  public BaseHButton(Dictionary dd, Object[] params) {
    this.dd = dd;
    initialize(params);
  }

  public BaseHButton(Object[] params) {
    initialize(params);
  }

  /** 属性type的取值：此按钮不会对对应字段值产生修改。即当字段只读和读写状态的时候可以使用。 */
  public static final Integer VALUE_TYPE_READONLY = new Integer(0);
  /** 属性type的取值：此按钮将会对对应字段值产生修改。即只有当字段可写状态的时候可以使用。 */
  public static final Integer VALUE_TYPE_READWRITE = new Integer(1);

  private LabelHField field = null;
  private Dictionary dd = null;
  protected Hashtable<String, Hashtable> componentAttrs = new Hashtable();
  private Integer type = VALUE_TYPE_READONLY;

  /** 属性：对应的字段控件。可以为空。 */
  public LabelHField getField() {
    return field;
  }

  public void setField(LabelHField field) {
    this.field = field;
  }

  /** 属性：数据字典 */
  public Dictionary getDd() {
    if (dd == null)
      return field.getDd();
    else
      return dd;
  }

  public void setDd(Dictionary dd) {
    this.dd = dd;
  }

  /**
   * 属性：按钮类型。可选值为以VALUE_TYPE_*开头的常量<br>
   * 对应参数名"type"，下一个参数为取值，类型为Integer。
   */
  public Integer getType() {
    return type;
  }

  public void setType(Integer type) {
    this.type = type;
  }

  /**
   * 输出HTML字符串。
   * 
   * @return 返回符合HTML语法的字符串，可以将其直接嵌入页面使用。
   */
  public abstract String toHTML();

  /**
   * 构造javascript脚本。将被加入到生成的页面中。
   * 
   * @return 返回构造好的脚本，为&lt;script/&gt;内的javascript脚本部分。
   */
  public String buildJS() {
    return null;
  }

  /**
   * 读取参数。
   * <p>
   * 开放给派生类以重写，用于新增加参数的解析。
   * 
   * @param paramName
   *          参数名
   * @param paramValue
   *          参数值
   * @return true/false，是否被成功解释。
   */
  protected boolean readParam(String paramName, Object paramValue) {
    return false;
  }

  /**
   * 设置界面元素的属性参数。
   * 
   * @param e
   *          界面元素对象
   * @param elementName
   *          界面元素的标识名。
   */
  protected void assignElementAttrs(ConcreteElement e, String elementName) {
    Hashtable eAttrs = componentAttrs.get(elementName);
    if (eAttrs == null)
      return;
    Enumeration keys = eAttrs.keys();
    while (keys.hasMoreElements()) {
      String key = (String) keys.nextElement();
      e.addAttribute(key, eAttrs.get(key));
    }
  }

  private void initialize(Object[] params) {
    for (int i = 0; i < params.length;) {
      String paramName = (String) params[i++];
      Object paramValue = params[i++];
      if ("type".equals(paramName)) {
        this.type = (Integer) paramValue;
      } else {
        if (readParam(paramName, paramValue))
          continue;
        String elementName = paramName;
        Hashtable attrs = componentAttrs.get(elementName);
        if (attrs == null) {
          attrs = new Hashtable();
          componentAttrs.put(elementName, attrs);
        }
        String attrName = (String) paramValue;
        Object attrValue = params[i++];
        attrs.put(attrName, attrValue);
      }
    }
  }

}
